/**
 * @file settings.h
 */
#ifndef SETTINGS_H
#define SETTINGS_H
#include <QObject>

/**
 * @class Settings
 * @brief klasa ustawień
 */
class Settings : public QObject
{
	Q_OBJECT
public:
	/**
	 * @return ilość źródeł
	 * @brief pobranie ilości źródeł
	 */
	const int &getSourcesCount() const;
	/**
	 * @return czas przerwy
	 * @brief pobranie czasu odstępu pomiędzy kolejnymi uruchomieniami zegara
	 */
	const double &getInterval() const;
	/**
	 * @return rozmiar planszy
	 * @brief pobieranie rozmiaru okna rysowania
	 */
	const int &getSize() const;
	/**
	 * @return przesunięcie
	 * @brief przestarzałe. Pobranie przesunięcia pola rysowania
	 */
	const int &getTranslation() const;
	/**
	 * @return kąt A
	 * @brief pobranie wartości kąta alpha
	 */
	const int &getKA() const;
	/**
	 * @return kąt B
	 * @brief pobranie wartości kąta beta
	 */
	const int &getKB() const;
	/**
	 * @return kąt C
	 * @brief pobranie wartości kąta gamma
	 */
	const int &getKC() const;
	/**
	 * @param source źródło dla którego mają być zapisane dane
	 * @param x referencja gdzie ma być zapisana pozycja wybranego źródła w x
	 * @param y referencja gdzie ma być zapisana pozycja wybranego źródła w y
	 * @brief pobieranie pozycji źródła
	 */
	void getSourcePosition(const int& source, int& x, int& y) const;
	/**
	 * @param source numer źródła
	 * @return amplituda źródła
	 * @brief zwrócenie amplitudy dla zadanego źródła
	 */
	const double &getAmplitude(const int &source) const;
	/**
	 * @param source numer źródła
	 * @return częstotliwość źródła
	 * @brief zwrócenie częstotliwości dla zadanego źródła
	 */
	const double &getFreq(const int &source) const;
	/**
	 * @param source numer źródła
	 * @return faza źródła
	 * @brief zwrócenie fazy dla zadanego źródła
	 */
	const double &getPhase(const int &source) const;
	
	~Settings();
public slots:
	/**
	 * @brief zmiana rozmiaru okienka generowanych punktów
	 * @param value nowy rozmiar
	 */
	void setSize(const int& value);
	/**
	 * @brief zmiana przesunięcia
	 * @param value nowe przesunięcie
	 */
	void setTranslation(const int & value);
	/**
	 * @brief zmiana czasu pomiędzy generowaniem klatek w trybie animacji
	 * @param value nowy czas 
	 */
	void serInterval(const int &value);
	/**
	 * @brief zmiana konta alpha
	 * @param value nowa wartośc kąta
	 */
	void setKA(const int& value);
	/**
	 * @brief zmiana konta beta
	 * @param value nowa wartośc kąta
	 */
	void setKB(const int& value);
	/**
	 * @brief zmiana konta gamma
	 * @param value nowa wartośc kąta
	 */
	void setKC(const int& value);
	/**
	 * @brief zmiana fazy źródła
	 * @param value wartość fazy
	 * @param source numer źródła
	 */
	void setPhase(const int &source,const double &value);
	/**
	 * @brief zmiana częstotliwośći źródła
	 * @param value wartość częstotliwości
	 * @param source numer źródła
	 */
	void setFreq(const int &source,const double &value);
	/**
	 * @brief zmiana amplitudy źródła
	 * @param value wartość amplitudy
	 * @param source numer źródła
	 */
	void setAmplitude(const int &source,const double &value);
	/**
	 * @brief zmiana ilości źródeł 
	 * @param count nowa ilość źródeł
	 */
	void setSourcesCount(const int &count);
	/**
	 * @brief zmian apozycji źródła
	 * @param x pozycja źródła w x
	 * @param y pozycja źródłą w y
	 * @param source numer źródła
	 *
	 */
	void setSourcePosition(const int& source, const int &x, const int &y);
	/**
	 * @brief ładowanie danych z pliku konfiguracyjnego
	 * @param name nazwa pliku
	 */
	void sLoadFromConfigFile(const char* name="settings.ini");
signals:
	/**
	 * @brief sygnał wysyłany po aktualizacji kontów
	 */
	void onUpdateDegree();

private:
	double * amplitude;
	double * freq;
	double * phase;

	int * position;
	int sources;
	Settings();

	int kA;
	int kB;
	int kC;

	double interval;
	int size;
	int translation;
public:
	/**
	 * @brief instancja ustawień
	 * @return instancja klasy Settings (zawsze ta sama)
	 */
	static Settings * instance();
};

#endif // SETTINGS_H
